/**
 * https://leetcode.cn/problems/longest-substring-without-repeating-characters/description/?envType=study-plan-v2&envId=top-100-liked
 * 给定一个字符串 s ，请你找出其中不含有重复字符的 最长 
子串
 的长度。

 

示例 1:

输入: s = "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc"，所以其长度为 3。
示例 2:

输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b"，所以其长度为 1。
示例 3:

输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke"，所以其长度为 3。
     请注意，你的答案必须是 子串 的长度，"pwke" 是一个子序列，不是子串。
 * @param {string} s
 * @return {number}
 */
/**
 * 计算给定字符串中最长无重复字符的子串的长度
 * @param {string} s - 输入的字符串
 * @return {number} - 最长无重复字符子串的长度
 */
var lengthOfLongestSubstring = function (s) {
  // 如果字符串为空，则返回0
  if (s.length == 0) return 0;

  // 使用Map来存储字符及其最新的索引位置
  const charIndexMap = new Map();
  // 初始化无重复字符子串的起始索引为0
  let start = 0;
  // 初始化最长无重复字符子串的长度为0
  let res = 0;

  // 遍历字符串中的每个字符
  for (let i = 0; i < s.length; i++) {
    const char = s[i];
    // 如果字符已经在Map中，并且其索引位置在当前子串的起始索引之前
    if (charIndexMap.has(char) && charIndexMap.get(char) >= start) {
      // 更新子串的起始索引为重复字符的下一个位置
      start = charIndexMap.get(char) + 1;
    }
    // 更新字符的索引位置为当前位置
    charIndexMap.set(char, i);
    // 更新最长无重复字符子串的长度
    res = Math.max(res, i - start + 1);
  }
  // 返回最长无重复字符子串的长度
  return res;
};

const s = "pwwkew";
console.log(lengthOfLongestSubstring(s));
